package GoPing

import (
	"sync"

	"gitee.com/liumou_site/logger"
)

// NewConcurrency 初始化並返回一個 Concurrency 實例，該實例用於並發地對多個IP地址進行ping操作。
// ips: 待檢查的IP地址列表。
// 返回值: 一個 Concurrency 實例，包含了IP地址列表、結果Map和其他用於並發操作的字段。
func NewConcurrency(ips []string) *Concurrency {
	// 檢查輸入的IP地址列表是否為空
	if len(ips) == 0 {
		logger.Error("IP地址列表為空")
		return &Concurrency{
			Addr:    []string{},
			Res:     sync.Map{},
			Result:  make(map[string]bool),
			Total:   0,
			Success: 0,
			Fail:    0,
		}
	}

	// 過濾ips列表，剔除非IP地址或無效域名的字串
	validIPs := FilterIP(ips)

	// 檢查過濾後的IP地址列表是否為空
	if len(validIPs) == 0 {
		logger.Error("所有IP地址均無效")
		return &Concurrency{
			Addr:    []string{},
			Res:     sync.Map{},
			Result:  make(map[string]bool),
			Total:   0,
			Success: 0,
			Fail:    0,
		}
	}

	// 記錄有效IP地址的數量
	logger.Info("有效IP地址數量: %d", len(validIPs))

	// 創建一個緩衝通道，用於接收ping的結果
	ch := make(chan string, len(validIPs))

	// 返回一個初始化好的Concurrency實例
	return &Concurrency{
		Addr:    validIPs,
		Res:     sync.Map{},
		Result:  make(map[string]bool, len(validIPs)),
		Ch:      ch,
		L:       sync.Mutex{},
		Total:   0,
		Success: 0,
		Fail:    0,
	}
}
